{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "001a42c0",
   "metadata": {},
   "source": [
    "## Attention Temporal Graph Convolutional Network (A3T-GCN)\n",
    "Pretty sure this one is poorly implemented. <br />\n",
    "The hidden state is never updated in the model and only the provided state is used. <br />\n",
    "Unless the time series is processed one step at a time, this one is pretty useless. <br />\n",
    "However, even then the model does not process anything temporally, it just accumulates node features sequentially."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb588c1e",
   "metadata": {},
   "source": [
    "### A3TGCN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "7e473b3a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 200/200 [01:04<00:00,  3.11it/s]\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train MSE: 0.8259\n",
      "Test MSE: 0.9723\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import torch\n",
    "from torch import nn\n",
    "import torch.nn.functional as F\n",
    "from torch_geometric_temporal.nn.recurrent import A3TGCN\n",
    "from torch_geometric_temporal.dataset import ChickenpoxDatasetLoader\n",
    "from torch_geometric_temporal.signal import temporal_signal_split\n",
    "\n",
    "from torch_geometric.data import DataLoader\n",
    "\n",
    "loader = ChickenpoxDatasetLoader()\n",
    "\n",
    "lags = 10\n",
    "stride = 1\n",
    "epochs = 200\n",
    "batch_size = 32\n",
    "\n",
    "dataset = loader.get_dataset(lags)\n",
    "\n",
    "sample = next(iter(dataset))\n",
    "num_nodes = sample.x.size(0)\n",
    "edge_index = sample.edge_index\n",
    "\n",
    "train_dataset, test_dataset = temporal_signal_split(dataset, train_ratio=0.2)\n",
    "\n",
    "train_loader = DataLoader(list(train_dataset), batch_size=batch_size, shuffle=True)\n",
    "test_loader = DataLoader(list(test_dataset), batch_size=batch_size, shuffle=False)\n",
    "\n",
    "### MODEL DEFINITION\n",
    "class AttentionGCN(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(AttentionGCN, self).__init__()\n",
    "\n",
    "        self.encoder = A3TGCN(1, 32, lags)\n",
    "        self.decoder = nn.Linear(32, 1)\n",
    "\n",
    "        # cached offsets for batch stacking for each batch_size\n",
    "        self.batch_edge_offset_cache = {}\n",
    "\n",
    "    def forward(self, window):\n",
    "        \n",
    "        x = window.x.unsqueeze(1)\n",
    "\n",
    "        N = num_nodes\n",
    "        B = x.size(0) // N\n",
    "\n",
    "        num_edges = edge_index.size(1)\n",
    "        try:\n",
    "            batch_offset = self.batch_edge_offset_cache[(B, num_edges)]\n",
    "        except:\n",
    "            batch_offset = torch.arange(0, N * B, N).view(1, B, 1).expand(2, B, num_edges).flatten(1,-1)\n",
    "            self.batch_edge_offset_cache[(B, num_edges)] = batch_offset\n",
    "        # repeat edge indices B times and add i*num_nodes where i is the snapshot index\n",
    "        batched_edge_index = edge_index.unsqueeze(1).expand(2, B, -1).flatten(1, -1) # repeated B times\n",
    "        batched_edge_index += batch_offset\n",
    "        \n",
    "        h = self.encoder(x, batched_edge_index) # (batch, lags, num_nodes, 1)\n",
    "        h = F.relu(h)\n",
    "\n",
    "        pred = self.decoder(h).flatten()\n",
    "\n",
    "        return pred\n",
    "    \n",
    "model = AttentionGCN()\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.01)\n",
    "\n",
    "### TRAIN\n",
    "model.train()\n",
    "\n",
    "loss_history = []\n",
    "for _ in tqdm(range(epochs)):\n",
    "    total_loss = 0\n",
    "    for i, window in enumerate(train_loader):\n",
    "        optimizer.zero_grad()\n",
    "        y_pred = model(window)\n",
    "        \n",
    "        assert y_pred.shape == window.y.shape\n",
    "        loss = torch.mean((y_pred - window.y)**2)\n",
    "        total_loss += loss.item()\n",
    "        \n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "    total_loss /= i+1\n",
    "    loss_history.append(total_loss)\n",
    "\n",
    "### TEST \n",
    "model.eval()\n",
    "loss = 0\n",
    "with torch.no_grad():\n",
    "    for i, window in enumerate(test_loader):\n",
    "        y_pred = model(window)\n",
    "        \n",
    "        assert y_pred.shape == window.y.shape\n",
    "        loss += torch.mean((y_pred - window.y)**2)\n",
    "    loss /= i+1\n",
    "\n",
    "### RESULTS PLOT\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "x_ticks = np.arange(1, epochs+1)\n",
    "ax.plot(x_ticks, loss_history)\n",
    "\n",
    "# figure labels\n",
    "ax.set_title('Loss over time', fontweight='bold')\n",
    "ax.set_xlabel('Epochs', fontweight='bold')\n",
    "ax.set_ylabel('Mean Squared Error', fontweight='bold')\n",
    "plt.show()\n",
    "\n",
    "print(\"Train MSE: {:.4f}\".format(total_loss))\n",
    "print(\"Test MSE: {:.4f}\".format(loss))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ba1b2eeb",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
